home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok03.lha
/
IFFLoad_1.1
/
IFFLoad.doc
< prev
next >
Wrap
Text File
|
1993-08-15
|
15KB
|
332 lines
(*---------------------------------------------------------------------------
:Program. IFFLoad.mod
:Author. Fridtjof Siebert
:Address. Nobileweg 67, D-7-Stgt-40
:Phone. 0711/822509
:Shortcut. [fbs]
:Version. 1.1
:Date. 24-May-88, 02:34:40 (!)
:Copyright. PD or Shareware, anyway you like (I like Shareware better).
:Language. Modula-II
:Translator. M2Amiga
:Imports. none.
:UpDate. 07-Jun-88: Laden 3x schneller durch Assembler !!! [fbs].
:Contents. Schnelle Ladeprozedur für IFF (ILBM)-Bilder.
:Remark. Thanks to Pit and Frank for their ideas to load to BitMap
:Remark. and to open a Window.
---------------------------------------------------------------------------*)
=============================================================================
= = = IFFLoad = = =
© Copyright 1988 by
Fridtjof Siebert
Nobileweg 67
7000 Stuttgart 40 (Stammheim)
Tel: (0)711/822509
=============================================================================
Mit der von IFFLoad exportierten Procedure können IFF-Bilder geladen
werden. Dabei wird das geladene Bild als Screen geöffnet. Das Bild kann
optional im Hintergrund geladen werden, d.h. der Screen wird beim Öffnen
nicht nach vorne, sondern nach hinten gelegt. Das Display (die
Bildschirm-DMAs) können während dem Laden abgeschaltetet werden. Das erhöht
die Geschwindigkeit. Gepackte Bilder werden entpackt. Beim Laden von
HAM-Bildern wird das ham-Bit in den ViewModes gesetzt.
------ Laden von IFF-Bildern: ------
Das Programm ShowIFF lädt und zeigt ein IFF-Bild. Es lädt das vorher auf
der Workbench angeklickte oder, beim starten vom CLI, das hinter dem Namen
angegebene Bild. Bilder, die ShowIFF als Default-Tool haben (Info), können
durch einfachen Doppelklick angezeigt werden. An diesem kurzen Programm
kann man leicht die Verwendung der Ladeprozedur studieren.
------ Informationen zum Bild: ------
Man braucht, um IFF-Bilder zu laden, eigentlich keine Ahnung von
IFF-Dateien haben. Wer jedoch Interesse an den genauen geladenen Werten
hat, der kann die Variable IFFInfo importieren. Sie enthält ein großes
verschachtelte RECORD. Vorsicht beim Laden von mehreren Bildern !!!
IFFInfo wird bei jedem Laden überschrieben. Man sollte dann den Typ
IFFInfoType importieren und IFFInfo in eigene Variablen kopieren.
------ Laden in BitMap: ------
Es ist möglich, beim Laden keinen Screen zu öffnen. Dies geschieht beim
Aufruf von ReadILBM durch die Option `dontopen'. Es wird eine BitMap-
Struktur angelegt, die die Bilddaten enthält. Sie befindent sich in
NuScreen.customBitMap^ (NuScreen importiert). Der Screen kann nachträglich
mit OpenScreen(NuScreen) geöffnet werden. Danach muß man jedoch die
Farben (sie stehen in IFFInfo.CMAP) mit SetRGB4() setzen. Vorsicht !!! Bei
`dontopen' muß der Speicher für die Grafikdaten und die BitMapstruktur
zurückgegeben werden! Eine BitMap ist normalerweise so groß wie die vom
IFF-File angegebene Screengröße. Ist dies jedoch kleiner, oder nur die
Breite oder nur die Höhe kleiner als die des Bildes selbst, so wird die
BitMap auch entsprechend größer. Dies gilt auch für einen Screen, wenn
dontopen nicht gesetzt ist !
Ein Beispielprogramm dafür ist IFFBitMapDemo.
------ ColorCycling: ------
Von IFFLoad können auch noch die Prozeduren DoCycle() und EndCycle()
importiert werden. Durch Sie kann man Colorcycling ein- bzw. ausschalten.
Es wird ein Interrupt so initialisiert, daß er daß Cycling vollständig
übernimmt. Wie man die Prozeduren handhabt kann man dem Programm
ShowCycle.mod entnehmen. Es entspricht dem Programm ShowIFF, nur für
Cycling-Bilder. Leider ist nicht bei allen nicht-Cycling Bilder das Color-
Cycling korrekt ausgeschaltet, so daß man diese nicht mit ShowCycle zeigen
kann (kein Guru, aber die Farben wandern !!!).
------ DiaShow: ------
Das Programm DiaShow zeigt mehrere Bilder nacheinander an. Alle Bilder, die
gezeigt werden sollen, müssen vorher mit gedrückter SHIFT-Taste ausgewählt
werden. Danach kann man DiaShow mit Doppelklick starten (SHIFT nicht
vergessen). Die Bilder werden nacheinander ein- und ausgeblendet. Der
Zeitabstand zwischen 2 Bildern beträgt 20 Sekunden. Vorher kann man mit der
rechten Maustaste das nächste Bild ansehen, wenn dieses bereits geladen
ist.
Wenn man DiaShow vom CLI aus startet, kann man die Bilder auch
unterschiedlich lang zeigen lassen. Die Anzeigadauer gibt man jeweils nach
dem Bildnamen an. Sie gilt auch für die dahinter folgenden Bilder.
Beispiel: DiaShow Bild1 10 Bild2 30 Bild3 Bild4 20
Bild1 wird 10, Bild2 und Bild3 30 und Bild4 20 Sekunden lang gezeigt.
------ Importieren von IFFLoad: ------
Wer von IFFLoad Prozeduren importiert braucht dazu die Datei IFFLoad.sym.
Außerdem müssen beim Linken die Dateien IFFLoad.obj und LoadBody.obj
vorhanden sein. Letztere enthält die Maschinenroutine zum schnellen Laden
des BODYs.
------ Die verschiedenen Dateien: ------
IFFLoad.doc : Diese Datei.
ShowIFF : ILBM-Ladeprogramm.
ShowIFF.mod : sein Quelltext.
ShowCycling : ILBM-Lader für Colorcycling-Bilder.
ShowCycling.mod : Quellcode.
IFFBitMapDemo : Demonstration für Laden mit Option `dontopen'.
IFFBitMapDemo.mod: Source.
DiaShow : Lader für mehrere Bilder. Enthält Prozeduren zum Ein- und
Ausblenden von Screens.
DiaShow.mod : Sourcecode.
IFFLoad.def : Definition der Ladeprozedur.
IFFLoad.mod : Ihre Implementation.
IFFLoad.sym : Symbol-Dation.
IFFLoad.obj : Fertig compiliertes IFFLoad.
LoadBody.asm : Der Assembler-Quelltext der Maschinenroutine.
LoadBody.prg : Die PC-relativ assemblierte Maschinenroutine.
LoadBody.code : File, das mit EXECUTE aufgerufen wird, und aus
LoadBody.prg die Dateien -.def und -.mod erzeugt. Dazu
muß sich das Tool M2ACode in einem mit Path angegebenem
Directory befinden.
LoadBody.def : Die Definition von LoadBody.
LoadBody.mod : Die Implementation.
LoadBody.sym : Symbol-Datei.
LoadBody.obj : Und compiliert.
------ Copyright: ------
Das Modul kann von jedem in nicht kommerziellen Programmen frei verwendet
werden. Wer genügend Geld hat, der kann einem armen Schüler (mir !) auch
eine Sharewaregebühr zukommen lassen. Mein ewiger Dank ist Ihm/Ihr dann
gewiß !
Bevor ein Programm, das dieses Modul benutzt kommerziell genutzt wird
(Veröffentlicht wird), muß sich der Autor mit mir in Verbindung setzten und
eine eventuelle Vergütung aushandeln.
-----------------------------------------------------------------------------
------ IFF für jedermann und jedefrau: ------
Da das IFF-Format fast nirgends gut erklärt wird, möchte ich
versuchen, wenigsten zum Bildformat eine einigermaßen brauchbare
Beschreibung zu geben.
------ Das IFF-Bildformat: ------
allgemeines:
Eine IFF-Datei beginnt mit der Kennung "FORM". Darauf folgt die
Länge der des Datenblocks.
Der Datenblock enthält dann die Kennung der Daten. Bei Bildern ist
sie "ILBM".
Darauf folgen beliebig viele Unterdatenblöcke. Sie beginnen
jeweils mit 4 Bytes, die die Daten Kennzeichnen. Ihnen folgt ein
Langwort, das wieder die Länge des Datenblocks angibt.
Der Aufbau einer ILBM-Datei (vor dem Doppelpunkt jeweils die Nummer
des Bytes):
0 : "FORM" --> Kennzeichnet IFF-Datei.
4 : LONGCARD --> Länge des Datenblocks, entspricht
Filelänge-8, da Daten beim 8. Byte beginnen.
8 : "ILBM" --> Kennzeichnet Grafikdatei. (interleaved Bitmap)
12 : Unterblock 1 --> Die verschiedenen Daten.
x : Unterblock 2
y : etc.
Die Unterblöcke:
"BMHD", BitMapHeader:
0 : "BMHD" --> Kennung des Blocks.
4 : LONGCARD(20) --> Länge der Daten: 20 Bytes.
8 : CARDINAL(dx) --> Breite der Grafik. (*)
10 : CARDINAL(dy) --> Höhe der Grafik. (*)
12 : INTEGER(x) --> x-Position der Grafik (LeftEdge)
14 : INTEGER(y) --> y-Position der Grafik (TopEdge)
16 : UBYTE(Depth) --> Anzahl der Bitplanes (*)
17 : UBYTE(Masking) --> Maske für Grafik. Normalerweise keine (0).
1: Maske vorhanden , dann enthält "BODY" eine zusätz-
liche Bitplane mit der Maske. Diese muß dann auch geladen
werden. (*)
2: Durchsichtige Farbe , dann steht in TransparentColor
eine Farbnummer, die als durchsichtig gelten soll.
3: Eine Maske kann erzeugt werden, indem man eine Art Lasso um
das Image wirft. Dazu zieht man eine Linie außen um das
Image und füllt den Innenraum von diesem Rand mit
transparentColor aus. Alles, was danach die Farbe
transparentColor hat, ist durchsichtig.
18 : UBYTE(Compression) --> 0: Daten nicht gepackt (*)
1: Daten gapackt, siehe "BODY"
19: UBYTE(0) --> nicht benutzt, muß 0 sein.
20: CARDINAL(transparentColor) --> Durchsichtiga Farbe, siehe
Making.
22: UBYTE(xAspect), UBYTE(yAspect) --> Verzerrung des Bildes.
bei 320x200 normalerweise 10:11.
24: INTEGER(dx) --> Breite des Screens.
26: INTEGER(dy) --> Höhe des Screens.
mit (*) gekennzeichnete müssen berücksichtigt werden.
"CMAP", ColorMap:
0 : "CMAP" --> Kennung des Blocks.
4 : LONGCARD(x) --> Länge des Blocks, entspricht der Zahl der
Farben durch drei. Gewöhnlich ist die Anzahl der Farben
gerade, weshalb kein Füllbyte eingefügt werden muß.
8 : UBYTE(Red) --> Rotanteil Farbe 0
9 : UBYTE(Green) --> Grünanteil
10 : UBYTE(Blue) --> Blauanteil
11 : UBYTE(Red) --> Rotanteil Farbe 1
12 : etc.
x+7: UByte(Blue) --> Blauanteil Farbe (x DIV 3)
"GRAB" definiert einen besonderen Punkt (hot spot) in der Grafik.
0 : "GRAB" --> Kennung.
4 : LONGCARD(4) --> Länge 4 Bytes.
8 : INTEGER(x) --> x-Position des markierten Punktes
10 : INTEGER(y) --> y-Position
"DEST", destination:
gibt an, in welche Bitplanes die GrafikDaten geschrieben werden.
0 : "DEST" --> Kennung.
4 : LONGCARD(8) --> Länge
8 : UBYTE(Depth) --> Anzahl Planes in Quell-Grafik
9 : UBYTE --> Füllbyte, 0.
10 : CARDINAL(PlanePick) --> siehe Intuition Ref. Manual, S.192 ff
12 : CARDINAL(PlaneOnOff)
14 : CARDINAL(PlaneMaks) --> zum schreiben benutzte Bitplanes.
"CAMG", gibt besondere ViewModes an:
0 : "CAMG"
4 : LONGCARD(4)
8 : LONGSET(ViewMode) --> Entspricht nicht (!) ViewModeSet{}.
{ 2} : Interlace
{10} : BoublePlayField
{17} : Hold and Modify
{31} : hires
"CRNG", für Colorcycling:
0 : "CRNG"
4 : LONGCARD(8)
8 : INTEGER --> 0, nicht benutzt.
10 : INTEGER(rate) --> Geschwindigkeit 60 je sec = 8000H
--> 30 je sec: 4000H, 1 pro sec: 8000H DIV 60...
12 : INTEGER --> eingeschaltet: ungleich 0
14 : UBYTE(low) --> unterste und
15 : UBYTE(high) --> oberste Grenze der Farbe.
"BODY", enthält die eigenlichen Bilddaten:
0 : "BODY"
4 : LONGCARD(x) --> Länge (Höhe*Breite*Tiefe/8)
8 : Daten. Je nachdem, ob in "BMHD" Compressed gewählt
wurde, gepackt oder nicht.
ungepackte BitMapDaten:
Daten der Reihe nach gespeichert: Zuerst 1. Zeile 1.
Bitplane, dann 1. Zeile 2. Bitplane etc. Danach 2. Zeile 1.
Bitplane, 2. Zeile 2. Bitplane etc.
gepackte BitMapDaten:
gepackt wird nur innerhalb einer Zeile. Die Zeilen sind der
Reihe nach wie bei ungepackt gespeichert.
Gepackt wird Byteweise:
Ist ein Byte
0..127 : bedeutet das: Die nächsten n+1 (1..128) Bytes
unverändert in die Grafik laden.
129..255: Das folgende Byte wird 257-n mal hintereinanger in die
Grafik kopiert.
128 : keine Funktion.
weitere Datenblocks:
"SPRT" für Sprites
"CCRT" Graphiccraft: Colorcycling
"CMHD" Graphiccraft (???)
"DPPV" Graphiccraft (???)
ein Ladeprogramm sollte Daten, die unbekannte Kennungen haben,
einfach überlesen. Die Länge steht ja jeweils im folgenden
Langwort.
Ein ILBM-File muß die Blocks "BMHD" und "BODY" enthalten. "CMAP"
sollte vorhanden sein. Alle anderen sind optional.
Beispiel:
0000: 464F524D 0000567A 494C424D 424D4844 FORM..VzILBMBMHD
0010: 00000014 014000C8 00000000 05020100 .....@..........
0020: 00020A0B 014000C8 434D4150 00000060 .....@..CMAP...`
0030: 00000090 10000000 00200020 30003040 ......... . 0.0@
0040: 10305010 40602050 70305080 4060A050 .0P.@` Pp0P.@`.P
0050: 70B06070 C07080D0 9090E0A0 A0F0C0C0 p.`p.p..........
0060: F06020D0 5020B040 10903010 60301040 .` .P .@..0.`0.@
0070: 20103000 000000B0 0000A000 00A00000 .0.............
0080: A00000A0 0000A000 00A00000 A00000A0 ................
0090: 44505056 00000068 00000000 00000000 DPPV...h........
00A0: 01680000 014000C8 0002005A 00020000 .h...@.....Z....
00B0: 00020000 00020000 00000000 00000000 ................
00C0: 00000000 00000000 00000000 00000000 ................
00D0: 00000000 00000000 00000000 00010002 ................
00E0: 00000000 00000000 00000000 00010002 ................
00F0: 00000000 00000000 00000000 00010002 ................
0100: 43524E47 00000008 19961800 0002020F CRNG............
0110: 43524E47 00000008 29304E78 00039D26 CRNG....)0Nx...&
0120: 43524E47 00000008 DD41AB4A FFFFFFF7 CRNG.....A.J....
0130: 43524E47 00000008 0047FFF4 00000001 CRNG.....G......
0140: 424F4459 00005539 11043336 01EFDC3F BODY..U9..36...?
0150: DCC00000 0161000D FFFF40F9 00026130 .....a....@...a0
0160: 03FE0004 B5C0C890 E1FE0011 FDC337FF ..............7.
Dies ist ein Beispiel für eine Lores-Grafik mit der Auflösung 320
mal 200 (14H: 0140H; 16H: 0C8H). Die Tiefe beträgt 5 Bitplanes
(1CH), deshalb besteht sie aus 32 Farben (in 2CH steht 60H, durch 3
also 20H=32). Die Daten in DPPV sollten überlesen werden. Die 4 CRNG
Blöcke sind meist auch unwichtig.
-- Fridtjof.